package com.lynn.lib_base.ui

import android.os.Bundle
import android.view.View
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding

abstract class BaseActivity<VDB : ViewDataBinding, VM : BaseViewModel>(private val layoutResId: Int) :
    AppCompatActivity(), IBaseView {

    open var mBinding: VDB? = null
    open var mViewModel: VM? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 启用沉浸式状态栏（Android 13+ 的边缘到边缘布局）
        enableEdgeToEdge()
        initParam()
        // 初始化 ViewDataBinding（根据 layoutResId 布局文件自动生成的）
        mBinding = DataBindingUtil.setContentView<VDB>(this, layoutResId)
        // 初始化ViewModel 实例
        mViewModel = initViewModel()
        // 设置数据
        setData()
        // 在Android开发中的作用是将当前Activity或Fragment的生命周期与DataBinding绑定，
        // 确保LiveData对象能够感知生命周期的变化，从而在UI更新时不会导致内存泄漏或无效的UI更新。
        // 具体作用
        // 感知生命周期变化‌：通过调用binding.setLifecycleOwner(this);，DataBinding能够感知到当前Activity或Fragment的生命周期变化。这意味着当Activity或Fragment被销毁时，绑定的LiveData对象也会相应地被清理，避免内存泄漏。
        // 自动更新UI‌：当LiveData对象中的数据发生变化时，如果设置了LifecycleOwner，DataBinding会自动更新绑定的视图，确保UI与数据保持同步。
        mBinding?.lifecycleOwner = this

        initView(savedInstanceState)

        // 初始化页面观察者的监听
        initViewObservable()

        ViewCompat.setOnApplyWindowInsetsListener(getLayoutRootView()) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }
    }

    abstract fun setData()


    abstract fun initView(savedInstanceState: Bundle?)

    /**
     * 1、初始化
     *   viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
     */
    abstract fun initViewModel(): VM


    /**
     * 获取布局文件中的根视图
     * ps: findViewById(R.id.root)
     */
    abstract fun getLayoutRootView(): View

}
